package com.gradumate.client.gui.formulier;

import java.util.TreeMap;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.gradumate.client.GraduMate;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * 
 * @author IJsbrand
 *
 */
public class AfstudeerVoorstelIndienen {
	
	private TabIntroductie tabIntroductie;
	private TabStudentgegevens tabStudentgegevens;
	private TabOrganisatie tabOrganisatie;
	private TabSpecificaties tabSpecificaties;
	private TabBevestiging tabBevestiging;
	private DecoratedTabPanel tp;
	private DialogBox dialboxSysteemcontrole;
	private VerticalPanel dialogboxvp;
	private HorizontalPanel hppopupbutton;
	private boolean[] anArray = new boolean[5]; //int is gelijk aan de hoeveelheid tabs van het tabpanel
	
	//. Asyncserver
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);
	
	public AfstudeerVoorstelIndienen() {
		// Laadschermpje.
		GraduMate.setLoadingImage(true);
		
		// Student uit cache halen
		final Gebruiker student = GraduMate.getGebruiker();
		
		// Mag door gaan?
		if (student.isHeeftToegang()) {
			
			// Controleren of de student al wat heeft ingediend.
			server.getStatusAfstudeerVoorstelStudent(student, new AsyncCallback<TreeMap<String, Boolean>>() {
				public void onFailure(Throwable caught) {
					GraduMate.addAsyncError();
					GraduMate.setLoadingImage(false);
				}

				public void onSuccess(TreeMap<String, Boolean> result) {
					
					GraduMate.setLoadingImage(false);

					if (result != null) {
						
						// Wanneer inbehandeling true is dan staat er een document in de map in behandeling.
						boolean afgekeurd = result.get("afgekeurd");
						boolean goedgekeurd = result.get("goedgekeurd");
						boolean inbehandeling = result.get("inbehandeling");
						boolean concept = result.get("concept");
						
						// De student mag door gaan wanneer: goedgekeurd, inbehandeling, concept false zijn en afgekeurd true of false
						if ((afgekeurd || !afgekeurd) && !goedgekeurd && !inbehandeling && !concept) {
							RootPanel.get("tabpanel").add(initPanel(student));
						// Concept
						} else if ((afgekeurd || !afgekeurd) && !inbehandeling && concept && !goedgekeurd) {
							GraduMate.addInformationMsg("Je afstudeerverzoek word op dit moment behandeld. Je word via de mail op de hoogte gesteld van de uitslag.");
						// In behandeling
						} else if ((afgekeurd || !afgekeurd) && inbehandeling && !concept && !goedgekeurd) {
							GraduMate.addInformationMsg("Je afstudeervoorstel word op dit moment behandeld. Je word via de mail op de hoogte gesteld van de uitslag.");
						// Goedgekeurd.
						} else if ((afgekeurd || !afgekeurd) && !inbehandeling && !concept && goedgekeurd) {
							GraduMate.addInformationMsg("Je afstudeervoorstel is goed gekeurd! Succes met afstuderen!");
						} else {
							GraduMate.addInformationMsg("Onbekend: " + afgekeurd + " " + goedgekeurd + " " + concept + " " + inbehandeling);
						}
					}
				}
			});
		} else {
			
			// Controleren of de toegang geforceerd is
			server.hasToegangVerleent(GraduMate.getGebruiker(), new AsyncCallback<Boolean>() {

				public void onFailure(Throwable caught) {
					GraduMate.addAsyncError();
					// Laadschermpje uitzetten
					GraduMate.setLoadingImage(false);
				}

				public void onSuccess(Boolean result) {					
					// Laadschermpje uitzetten
					GraduMate.setLoadingImage(false);
					
					if (!result) {
						GraduMate.addErrorMsg("Je kan op dit moment nog geen afstudeervoorstel indienen. Je bent niet ingeschreven voor het" +
								"afstudeersemster. Mocht je toch ingeschreven hebben voor het afstudeersemster meld je dan evne bij de afstudeeradministratie.");
					} else {
						RootPanel.get("tabpanel").add(initPanel(GraduMate.getGebruiker()));
					}
				}
			});
		}
	}

	public Widget initPanel(Gebruiker gebruiker) {
		anArray[0] = true; //Dit omdat de tab Introductie geen validatie heeft en dus altijd de status true mag hebben
		tabIntroductie = new TabIntroductie(this);
		tabStudentgegevens = new TabStudentgegevens(this, gebruiker);
		tabOrganisatie = new TabOrganisatie(this);
		tabSpecificaties = new TabSpecificaties(this);
		tabBevestiging = new TabBevestiging(this, gebruiker);

		//Initieer de DecoratedTabPanel
		tp = new DecoratedTabPanel();
		tp.setSize("100%", "100%");
		tp.add(tabIntroductie.getTabIntroductie(), "1.Introductie >");
		tp.add(tabStudentgegevens.getTabStudentgegevens(), "2.Studentgegevens >");
		tp.getTabBar().setTabEnabled(1, false);
		tp.add(tabOrganisatie.getTabOrganisatie(), "3.Organisatie >", true);
		tp.getTabBar().setTabEnabled(2, false);
		tp.add(tabSpecificaties.getTabSpecificaties(), "4.Opdracht specificaties >", false);
		tp.getTabBar().setTabEnabled(3, false);
		tp.add(tabBevestiging.getTabBevestiging(), "5.Bevestiging", false);
		tp.getTabBar().setTabEnabled(4, false);
		tp.setAnimationEnabled(true);
		tp.selectTab(0);

		initDialogBox();
		return tp;
	}

	public void changeTab(int bron, int bestemming) {
		if(anArray[bron]){
			tp.selectTab(bestemming);
			tp.getTabBar().setTabEnabled(bestemming, true);
		}
	}

	/**
	 * Methode die de DialogBox een tekst en titel meegeeft en het vervolgens toont aan de student.
	 * @param msg De tekst die in de DialogBox moet verschijnen
	 * @param title De kop/heading van het bericht. Bijv. 'Foutmelding'
	 */
	public void showDialogBox(String msg, String title){	
		dialboxSysteemcontrole.setText(title);
		dialogboxvp.clear();
		dialogboxvp.add(new HTML(msg));
		dialogboxvp.add(hppopupbutton);
		dialboxSysteemcontrole.center();
		dialboxSysteemcontrole.setVisible(true);
	}

	/**
	 * Methode die de DialogBox initialiseert die in het gehele TabPanel gebruikt wordt om meldingen weer te geven
	 */
	public void initDialogBox(){
		//Initieert de dialogBox
		dialboxSysteemcontrole = new DialogBox();
		dialboxSysteemcontrole.setAnimationEnabled(true);
		dialboxSysteemcontrole.setGlassEnabled(true);
		dialboxSysteemcontrole.hide();

		Button popupbtOk = new Button("Ok");
		popupbtOk.setWidth("100px");
		popupbtOk.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				dialboxSysteemcontrole.hide();
			}
		});

		hppopupbutton = new HorizontalPanel();
		hppopupbutton.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		hppopupbutton.add(popupbtOk);
		dialogboxvp = new VerticalPanel();
		dialogboxvp.setWidth("375px");
		dialogboxvp.setHeight("100%");

		dialboxSysteemcontrole.add(dialogboxvp);
	}

	/**
	 * Methode die de status van een tab set op true of false. Dit wordt gebruikt bij de bepaling of de student naar
	 * een andere tab mag.
	 * @param tabnaam De naam van de tab waar de student zich op bevind
	 * @param status De status van de tab, is de tab correct afgehandeld/ingevuld dan is de status true en anders false
	 */
	public void tabStatus(String tabnaam, boolean status){
		//de int van de array is gelijk aan de index van het tabpanel. 
		//Dus tab index 1 van tabpanel is 'Studentgegevens' en array index 1 is de status van de tab 'Studentgegevens'
		//Zo kan de status makkelijk gekoppeld worden aan de tab wat gebruikt wordt in de methode 'changeTab'
		if(tabnaam.equals("TabStudentgegevens")){ 
			anArray[1] = status; 
		}
		if(tabnaam.equals("TabOrganisatie")){
			anArray[2] = status;
		}
		if(tabnaam.equals("TabSpecificaties")){
			anArray[3] = status;
		}
		if(tabnaam.equals("TabBevestiging")){
			anArray[4] = status;
		}
	}

	/**
	 * Methode die tekst mee krijgt en doorstuurt naar 'TabBevestiging' waar het aan de labels meegegeven wordt.
	 * Dit zijn de labels die je als student bij je overzicht te zien krijgt aan het einde van het webformulier. 
	 * @param labelNaam De naam van de label die een nieuwe waarde moet krijgen in de tab 'Bevestiging'
	 * @param tekst De waarde/tekst die de label moet krijgen
	 */
	public void setLabel(String labelNaam, String tekst){
		tabBevestiging.setLabel(labelNaam, tekst);
	}

}